import CryptoJS from 'crypto-js';

export default {
    /**
     * AES加密
     * @param {String} plaintext 需要加密的字符串
     * @param {String} password 加密密码
     * @return {String} 加密后的字符串，包括IV和密文的Base64编码
     */
    aesEncrypt(plaintext, password) {
        const key = CryptoJS.enc.Utf8.parse(password); // 密码转换为WordArray
        const iv = CryptoJS.lib.WordArray.random(128 / 8); // 随机生成IV

        const encrypted = CryptoJS.AES.encrypt(plaintext, key, {
            iv: iv,
            mode: CryptoJS.mode.CBC,
            padding: CryptoJS.pad.Pkcs7
        });

        // 提取密文（ciphertext）并进行Base64编码
        const ivBase64 = CryptoJS.enc.Base64.stringify(iv);  // Base64编码IV
        const encryptedBase64 = CryptoJS.enc.Base64.stringify(encrypted.ciphertext); // Base64编码密文

        return ivBase64 + '.' + encryptedBase64; // 拼接IV和密文，使用点号分隔
    },

    /**
     * AES解密
     * @param {String} ciphertext 需要解密的字符串，包括IV和密文的Base64编码
     * @param {String} password 解密密码
     * @return {String} 解密后的字符串
     */
    aesDecrypt(ciphertext, password) {
        const key = CryptoJS.enc.Utf8.parse(password); // 密码转换为WordArray

        // 从传入的字符串中提取出Base64编码的IV和密文
        const parts = ciphertext.split('.');
        if (parts.length !== 2) {
            throw new Error('Invalid ciphertext format');
        }
        const ivBase64 = parts[0];
        const encryptedBase64 = parts[1];

        const iv = CryptoJS.enc.Base64.parse(ivBase64); // 解码IV
        const encrypted = CryptoJS.enc.Base64.parse(encryptedBase64); // 解码密文

        // 解密
        const decrypted = CryptoJS.AES.decrypt({
            ciphertext: encrypted
        }, key, {
            iv: iv,
            mode: CryptoJS.mode.CBC,
            padding: CryptoJS.pad.Pkcs7
        });

        return CryptoJS.enc.Utf8.stringify(decrypted); // 转为UTF-8字符串
    }
};